home *** CD-ROM | disk | FTP | other *** search
/ 3D GFX / 3D GFX.iso / pcutils / windows / genesis / include / debug.h < prev    next >
C/C++ Source or Header  |  1995-12-30  |  5KB  |  163 lines

  1. /*------------------------------------------------------------------
  2.             Debug Library
  3.             -------------
  4.  
  5.     Header for C interface to debug library
  6.  
  7.     (C) Silicon Dream Ltd 1994
  8.  
  9.   ------------------------------------------------------------------
  10.  
  11. Changes:                        Date:
  12. * Created file                        27/10/94
  13. */
  14.  
  15. #ifndef DEBUG
  16. #define DEBUG
  17.  
  18. #include <stdarg.h>
  19. #include <stdlib.h>
  20. #include <atomic.h>
  21.  
  22. /* Defined operations:
  23.  
  24.     DebOut("debug.txt+")        First call to Deb should provide an output file name
  25.                       The optional '+' provides additional output to the console
  26.     DebOut("....", p1, p2...pn);    Outputs a formatted debug string with a timestamp
  27.     DebOut(FLUSH)            Forces flushing buffer contents to file
  28.     DebOut(STOP)            Flushes buffer to file and closes the file
  29.     Malloc(size)            Allocates memory
  30.     Free(ptr)            Frees memory
  31.     DebListMem()            Lists details of all memory currently allocated to the
  32.                     debug output file
  33.  
  34.     Given that the debug library can be linked to many EXEs and/or DLLs at the
  35.     same time the rules governing what appears in what file are quite straightforward.
  36.     There is one output file per instance (ie. per data segment to which the library
  37.     is linked). If say we link to a DLL with one data segment per instance, then each
  38.     task using the DLL will have a seperate output file. The first call to DebOut() for
  39.     each instance should provide the name of an output file. The allocated memory list
  40.     also works on a per-instance basis, so for instance an EXE linked to the library will
  41.     get only its allocated memory shown by DebListMem() and not that of some DLL linked
  42.     to its own copy of the library
  43. */
  44.  
  45. #define FLUSH        "\xff\0"
  46. #define STOP        "\xfe\0"
  47.  
  48. typedef void (* DebOutFunc) (char *sz, ...);
  49. typedef void (* AddOutFunc) (char *sz);
  50. typedef void *(* AppAllocFunc) (ulong ulSize, ulong *pulSizeGot);
  51. typedef void (* AppFreeFunc) (void *pv);
  52. typedef char MemoryLink[32];    // TEMP - WE SHOULDNT NEED THIS NOW
  53.  
  54. extern void Deb (ulong ulClock, char *sz, AddOutFunc pfnAddOut, va_list val);
  55. extern void *DebAlloc (ulong ulSizeIn, char *szFN, ushort usLine, bool bNew, AppAllocFunc DebAppAlloc);
  56. extern void DebFree (void *pvMem, bool bDeb, ulong ulSegSize, AppFreeFunc DebAppFree);
  57. extern void DebMem (DebOutFunc pfnDebOut);
  58.  
  59. /* If we're linking the debug library with a windows DLL we will not get
  60.    access to the standard C library function clock, instead we use the
  61.    windows function GetTickCount. Also it seems the malloc function can
  62.    corrupt memory under windows so instead we call two seperate memory
  63.    allocation routines for windows and non windows programs */
  64.  
  65. //------------------ C PROGRAM -------------------------
  66. #ifndef _WINDOWS
  67.  
  68. #include <time.h>
  69.  
  70. #ifdef _DEBUG
  71. _st void AddOut (char *sz)
  72.     {
  73.     printf(sz);
  74.     }
  75.  
  76. _st void DebOut (char *sz, ...)
  77.     {
  78.     va_list        val;
  79.  
  80.     va_start(val, sz);
  81.     Deb(((ulong) clock())*1000L/CLOCKS_PER_SEC, sz, AddOut, val);
  82.     va_end(val);
  83.     }
  84. #endif
  85.  
  86. #define SEG_SIZE    32768        // memory allocated in 32K blocks
  87.  
  88. _st void *DebAppAlloc (ulong ulSize, ulong *pulSizeGot)
  89.     {
  90.     if (ulSize<SEG_SIZE)
  91.         ulSize=SEG_SIZE;
  92.     *pulSizeGot=ulSize;
  93.     return malloc((size_t) ulSize);
  94.     }
  95.  
  96. _st void DebAppFree (void *pv)
  97.     {
  98.     free(pv);
  99.     }
  100.  
  101. #endif
  102.  
  103. //------------------ WINDOWS PROGRAM -------------------
  104. #ifdef _WINDOWS
  105.  
  106. #include <windows.h>
  107.  
  108. #ifdef _DEBUG
  109. _st void AddOut (char *sz)
  110.     {
  111.     OutputDebugString(sz);
  112.     }
  113.  
  114. _st void DebOut (char *sz, ...)
  115.     {
  116.     va_list        val;
  117.  
  118.     va_start(val, sz);
  119.     Deb(((ulong) GetTickCount()), sz, AddOut, val);
  120.     va_end(val);
  121.     }
  122. #endif
  123.  
  124. #define SEG_SIZE    32768        // memory allocated in 32K blocks
  125.  
  126. _st void *DebAppAlloc (ulong ulSize, ulong *pulSizeGot)
  127.     {
  128.     HGLOBAL        hg, *phg;
  129.  
  130.     if (ulSize<SEG_SIZE)
  131.         ulSize=SEG_SIZE;
  132.     if ((hg=GlobalAlloc(0, ulSize+sizeof(HGLOBAL)))==0)
  133.         return NULL;
  134.     *pulSizeGot=ulSize;
  135.     phg=(HGLOBAL *) GlobalLock(hg);
  136.     *phg=hg;
  137.     return (void *) (phg+1);
  138.     }
  139.  
  140. _st void DebAppFree (void *pv)
  141.     {
  142.     HGLOBAL        *phg=((HGLOBAL *) pv)-1;
  143.  
  144.     GlobalUnlock(*phg);
  145.     GlobalFree(*phg);
  146.     }
  147.  
  148. #endif
  149.  
  150. //------------------ ANY PROGRAM -----------------------
  151. #ifdef _DEBUG
  152. #define Malloc(x)    DebAlloc(x, __FILE__, __LINE__, FALSE, DebAppAlloc)
  153. #define Free(x)        DebFree(x, TRUE, SEG_SIZE, DebAppFree)
  154. #define DebListMem()    DebMem(DebOut)
  155. #endif
  156. #ifndef _DEBUG
  157. #define Malloc(x)    DebAlloc(x, NULL, 0, FALSE, DebAppAlloc)
  158. #define Free(x)        DebFree(x, FALSE, SEG_SIZE, DebAppFree)
  159. #define DebListMem()    ;
  160. #endif
  161.  
  162. #endif DEBUG        // Do no include this file twice
  163.